home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / games / spassion / source.lzh / SOURCE / SOUND.C < prev    next >
Text File  |  2000-03-31  |  5KB  |  199 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <io.h>
  5. #include "SPASSION.H"
  6. #include "SOUND.H"
  7.  
  8. static void *music_ptr[MAX_MUSIC];    /* 読み込んだ .ZMD データへのポインタ */
  9. static int music_size[MAX_MUSIC];    /* ↑       のサイズ */
  10. static void *se_ptr[MAX_SE];        /* 読み込んだ .PCM データへのポインタ */
  11. static int se_size[MAX_SE];            /* ↑       のサイズ */
  12.  
  13. /*うまくいかなかったので今回は使わない*/
  14. #if 0
  15. static void *zpd_ptr[MAX_SE];        /* 読み込んだ .ZPD データへのポインタ */
  16. static int zpd_size[MAX_SE];        /* ↑       のサイズ */
  17. #endif
  18. static short se_no = 0;                /* 鳴らす効果音の番号 */
  19. /*short        *seq_tbl;*/                /* Z-muSiC内部ワークの開始番地 */
  20.  
  21. /*
  22.         サウンド初期化
  23. */
  24.  
  25. void InitSound( void )
  26. {
  27.     FILE    *fp, *fp2;
  28.     int        i,data_no;
  29.     char    str1[1024];
  30.     void    SetZPD( char *fname, short num );
  31.     void    ChangeZPD( short num );
  32.     void    game_end();
  33.  
  34. /*        常駐チェック        */
  35.     if( ZmKeepCheck () ){        /* ZMUSIC が常駐しているか調べる */
  36.         static char e[256];
  37.         error_level = ERROR_MUSIC;
  38.         error_message = e;
  39.         sprintf(e, "Zmusicを常駐してください。\n");
  40.         game_end();    /* 返ってこない */
  41.     }
  42. /*    seq_tbl = z_get_wk_tbl();*/    /* なんに使うか分からないので消しとく */
  43.     ZmInit();
  44.  
  45.     for (i = 0; i < MAX_SE; i++)
  46.         se_ptr[i] = NULL;
  47.     for (i = 0; i < MAX_MUSIC; i++)
  48.         music_ptr[i] = NULL;
  49.  
  50.     /* SOUND.CNF 読み込み */
  51.     if ((fp = fopen ("SOUND.CNF", "r")) == NULL) {
  52.         static char e[256];
  53.         error_level = ERROR_MUSIC;
  54.         error_message = e;
  55.         sprintf(e, "SOUND.CNF が読み込めません\n");
  56.         game_end();    /* 返ってこない */
  57.     }
  58.     while (fscanf (fp, "%s", str1) != EOF) {
  59.         if (ferror (fp) || feof (fp))
  60.             break;
  61.         if (!strcmpi (str1, "SE")) {
  62.             fscanf (fp, "%d %s", &data_no, &str1);
  63.             if ((fp2 = fopen (str1, "rb")) == NULL) {
  64.                 static char e[256];
  65.                 error_level = ERROR_MUSIC;
  66.                 error_message = e;
  67.                 sprintf (e, "ファイル %s が読み込めません\n", str1);
  68.                 game_end();    /* 返ってこない */
  69.             }
  70.             se_size[data_no] = filelength (fileno (fp2));
  71.             if ((se_ptr[data_no] = malloc (se_size[data_no])) == NULL) {
  72.                 static char e[256];
  73.                 error_message = e;
  74.                 sprintf (e, "効果音用メモリが足りません\n");
  75.                 error_level = ERROR_FILE;
  76.                 game_end();    /* 返ってこない */
  77.             }
  78.             fread(se_ptr[data_no], se_size[data_no], 1, fp2);
  79.             fclose(fp2);
  80.             fgets(str1, 1024, fp);    /* 以下読み捨てる */
  81.             continue;
  82.         }
  83.         if (!strcmpi (str1, "MUSIC")) {
  84.             fscanf (fp, "%d %s", &data_no, &str1);
  85.             if ((fp2 = fopen (str1, "rb")) == NULL) {
  86.                 static char e[256];
  87.                 error_level = ERROR_MUSIC;
  88.                 error_message = e;
  89.                 sprintf (e, "ファイル %s が読み込めません\n", str1);
  90.                 game_end();    /* 返ってこない */
  91.             }
  92.             music_size[data_no] = filelength (fileno (fp2));
  93.             if ((music_ptr[data_no] = malloc (music_size[data_no])) == NULL) {
  94.                 static char e[256];
  95.                 error_level = ERROR_FILE;
  96.                 error_message = e;
  97.                 sprintf (e, "音楽用メモリが足りません\n");
  98.                 game_end();    /* 返ってこない */
  99.             }
  100.             fread (music_ptr[data_no], music_size[data_no], 1, fp2);
  101.             fclose (fp2);
  102.             fgets (str1, 1024, fp);    /* 以下読み捨てる */
  103.             continue;
  104.         }
  105.         fgets (str1, 1024, fp);    /* 以下読み捨てる */
  106.         if (ferror (fp) || feof (fp))
  107.             break;
  108.     }
  109.     fclose (fp);
  110. /*うまくいかなかったので今回は使わない*/
  111. #if 0
  112.     SetZPD( "MUSIC/STG200MK.ZPD", 0 );
  113.     SetZPD( "MUSIC/SLW1.ZPD", 1 );
  114.     ChangeZPD( 0 );
  115. #endif
  116. }
  117.  
  118. /* 音楽を鳴らす */
  119. void    PlayBGM( int no )
  120. {
  121.     Stop();        /* 演奏を停止する */
  122.     if( music_ptr[no] )
  123.         ZmPlay(music_ptr[no], music_size[no]);
  124. }
  125.  
  126. /* 効果音をセットする(けど鳴らさない) */
  127. void SetSE( short no )
  128. {
  129.     /* 優先順位を判定 */
  130.     if(no > se_no)
  131.         se_no = no;
  132. }
  133.  
  134.  
  135. /* 効果音を鳴らす */
  136. void PlaySE( void )
  137. {
  138.     if( pcm_mode ){
  139.         if(se_no){
  140.             if(se_ptr[se_no]){
  141.                 ZmAdpcmSE(se_ptr[se_no], se_size[se_no], 4 * 256 + 3, se_no);
  142.             }
  143.             se_no = 0;
  144.         }
  145.     }
  146. }
  147.  
  148. /*うまくいかなかったので今回は使わない*/
  149. #if 0
  150. void SetZPD( char *fname, short num )
  151. {
  152.     FILE    *fp;
  153.     void    game_end();
  154.  
  155.     if((fp = fopen (fname, "rb")) == NULL) {
  156.         static char e[256];
  157.         error_message = e;
  158.         sprintf(e, "%s が読み込めません\n",fname);
  159.         game_end();    /* 返ってこない */
  160.     }
  161.     zpd_size[num] = filelength(fileno (fp));
  162.     if ((zpd_ptr[num] = malloc(zpd_size[num])) == NULL) {
  163.         static char e[256];
  164.         error_message = e;
  165.         sprintf (e, "ZPD用メモリが足りません\n");
  166.         game_end();    /* 返ってこない */
  167.     }
  168.     fread(zpd_ptr[num], zpd_size[num], 1, fp);
  169.     fclose(fp);
  170. }
  171.  
  172. void ChangeZPD( short num )
  173. {
  174.     void    set_zpd( void * );
  175.     set_zpd( zpd_ptr[num]+8 );
  176. }
  177. #endif
  178.  
  179.  
  180. /* 特に使わなくてもいいようなので */
  181. #if 0
  182. /* 終了時に1回だけ呼ばれる */
  183. void SoundTini0 (void)
  184. {
  185.     int i;
  186.  
  187.     FadeOut(64);
  188.  
  189.     for(i = 0; i < MAX_SE; i++) {
  190.         if (se_ptr[i] != NULL)
  191.             free(se_ptr[i]);
  192.     }
  193.     for(i = 0; i < MAX_MUSIC; i++) {
  194.         if(music_ptr[i] != NULL)
  195.             free(music_ptr[i]);
  196.     }
  197. }
  198. #endif
  199.